#include "repita.h"

Repita::Repita(Sentencia *next, Expr *expr, Sentencia *instrucciones, int fila, int col):Sentencia(next,fila,col)
{
    this->expr = expr;
    this->instrucciones=instrucciones;
}

Expr *Repita::getExpr()
{
    return this->expr;
}

Sentencia *Repita::getInstrucciones()
{
    return this->instrucciones;
}

void Repita::setExpr(Expr *expr)
{
    this->expr=expr;
}

void Repita::setInstrucciones(Sentencia *instrucciones)
{
    this->instrucciones = instrucciones;
}

string Repita::is()
{
    return "REPITA";
}

Tipo_ts *Repita::validarSemantica(Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    Tipo_ts *tts = this->expr->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    if(tts->is().compare("BOOLEANO")==0){
        if(this->instrucciones!=0){
            this->instrucciones->validarSemantica(tabla_de_tipo,tabla_de_varaible);
        }

    }else{
        stringstream out;
        out<<"Expreccion debe de ser booleana// Fila:"<<this->getFila()<<endl;
        throw exception(out.str().c_str());
    }

    if(this->getNext()!=0){
        this->getNext()->SetReturn(this->GetReturn());
        this->getNext()->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    return 0;
}

string Repita::generarCodigo(GenerarVariable *var, Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    string codigo = "do{\n";
    if(this->getInstrucciones()!=0){
    codigo += this->getInstrucciones()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
    }
    codigo += "}while("+this->getExpr()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible).codigo+");\n";
    if(this->getNext()!=0){
        codigo += this->getNext()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
    }

    return codigo;
}


